package 每日一题;

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-11-29
 **/

public class No786第K个最小的素数分数 {

    /**
     * 给你一个按递增顺序排序的数组 arr 和一个整数 k 。
     * 数组 arr 由 1 和若干 素数  组成，且其中所有整数互不相同。
     * 对于每对满足 0 < i < j < arr.length 的 i 和 j ，可以得到分数 arr[i] / arr[j] 。
     * 那么第 k 个最小的分数是多少呢?  以长度为 2 的整数数组返回你的答案,
     * 这里 answer[0] == arr[i] 且 answer[1] == arr[j] 。
     * <p>
     * 示例 1：
     * 输入：arr = [1,2,3,5], k = 3
     * 输出：[2,5]
     * 解释：已构造好的分数,排序后如下所示:
     * 1/5, 1/3, 2/5, 1/2, 3/5, 2/3
     * 很明显第三个最小的分数是 2/5
     * 示例 2：
     * 输入：arr = [1,7], k = 1
     * 输出：[1,7]
     *  
     * <p>
     * 提示：
     * 2 <= arr.length <= 1000
     * 1 <= arr[i] <= 3 * 104
     * arr[0] == 1
     * arr[i] 是一个 素数 ，i > 0
     * arr 中的所有数字 互不相同 ，且按 严格递增 排序
     * 1 <= k <= arr.length * (arr.length - 1) / 2
     */

    public int[] kthSmallestPrimeFraction(int[] arr, int k) {

        Map<Double, int[]> map = new HashMap<>();
        PriorityQueue<Double> priorityQueue = new PriorityQueue<>(3, (p1, p2) -> (p2 - p1) < 0D ? -1 : (p2 - p1) == 0 ? 0 : 1);

        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                double num = (double) arr[j] / (double) arr[i];
                if (priorityQueue.size() < k) {
                    priorityQueue.add(num);
                    map.put(num, new int[]{j, i});
                } else if (priorityQueue.peek() > num) {
                    Double poll = priorityQueue.poll();
                    map.remove(poll);
                    priorityQueue.add(num);
                    map.put(num, new int[]{j, i});
                }
            }
        }

        int[] ints = map.get(priorityQueue.peek());
        return new int[]{arr[ints[0]], arr[ints[1]]};
    }

    public static void main(String[] args) {
        No786第K个最小的素数分数 n = new No786第K个最小的素数分数();
        int[] result = n.kthSmallestPrimeFraction(new int[]{1, 2, 3, 5}, 3);
        System.out.println(JSON.toJSONString(result));
    }

}
